#ifndef adr_component_H
#define adr_component_H

#include "raw_message.h"
#include "ca_node.h"
#include "component_factory.h"
//#include "klog.h"
#include "klogger_helper.h"
#include "capilot_data_receiver.h"

class adr_component : public CaNode  // 继承自CaNode，可能是一个基础节点类，提供组件的基本功能
{
public:
    adr_component();  // 构造函数，初始化对象
    ~adr_component(); // 析构函数，释放资源 

    void adrInit();  // 组件的初始化函数，可能包含整体初始化逻辑
    void printLossBatch(const std::string& topic_name, size_t batch);  // 打印丢失的批次信息，参数为话题名和批次大小
    void vedioTopicInit();  // 视频相关话题的初始化（可能是订阅或发布视频数据的话题）
    void midTopicInit();    // 中间件相关话题的初始化（处理中间层数据的话题）
    void pictureTopicInit();  // 图片相关话题的初始化（处理图片数据的话题）
    void rpcTopicInit();     // RPC（远程过程调用）相关话题的初始化
    void parkCollectTopicInit(std::string path);  // 停车场数据采集话题的初始化，参数为路径（可能是数据存储路径）
    void getAndrEnvirAgain();  // 重新获取安卓环境信息
    void calibFileInit();      // 标定文件的初始化（加载或处理标定相关文件）
    void getDataFromCapilot();  // 从Capilot获取数据（Capilot可能是一个外部模块或系统）
    std::string getLaserPlasmaCloudData(const string &topic, const string &data);  // 处理激光等离子云数据，参数为话题和数据，返回处理后的数据
    bool isShutDown=false;  // 标记组件是否已关闭

public:
    // 回调函数，处理收到的消息，参数为话题名、原始消息数据、时间戳
    void onObjectCallback(const std::string &topic, const capilot::RawMessage &data, const double &time);

    // RPC回调函数，处理RPC请求，参数为话题名、请求数据、回复数据（输出参数）
    void onObjectRpcCallback(const std::string &topic, const std::string &requestData, std::string *replyData);

protected:
    virtual void init() override;    // 重写父类的初始化函数，可能是组件启动时的初始化
    virtual void shutdown() override;  // 重写父类的关闭函数，组件关闭时释放资源

private:
    void selfGetAndrEnvir();  // 内部获取安卓环境信息的函数

    void cerJudge();       // 证书判断（可能是验证证书有效性）
    void encapCerJudge();  // 封装证书判断（处理证书相关的封装逻辑）
    int dlopen_getCer();   // 动态加载库获取证书，返回状态码（可能是加载lib获取证书）
    void timeOut_sendDiagnosis();  // 超时发送诊断信息（超时情况下触发诊断数据发送）

    vector<CapilotDataReceiver *> vPointers;  // 存储Capilot数据接收器的指针列表（管理数据接收回调的绑定）
    std::set<string> m_bigTopicSet;  // 存储需要打印“数据过大”提示的话题集合（避免重复打印）
};

#endif // adr_component_H